<?php

namespace Common\Model;

use Think\Model;

/**
 * 用户关注社区模型
 */
class UserBbsModel extends Model {

    const NORMAL = 0;   // 关联状态：正常
    const DELETE = -1;  // 关联状态：删除

    const USER_BBS_KEY = 'userbbs:';    // 用户社区关系缓存键名

    /**
     * 新增用户与社区关系数据
     * @param $uid
     * @param $bid
     * @return mixed
     */
    public static function addData($uid, $bid){
        $data = [
            'uid' => $uid,
            'bid' => $bid
        ];
        if($id = M('UserBbs')->add($data)){
            self::clearCache($uid);
        }
        return $id;
    }

    /**
     * 获取用户关注的社区ID列表数组，如：[20,34,12,25]
     * @param $uid
     * @return mixed
     */
    public static function getUserBbssId($uid){
        $key = self::USER_BBS_KEY.$uid;
        $result = S($key);
        if(false === $result){
            $result = M('UserBbs')->where(['uid' => $uid, 'status' => self::NORMAL])->field('bid')->select();
            if(false !== $result){
                S($key, is_null($result) ? [] : $result);
            }
        }
        if(!$result){
            return null;
        }
        $arr = [];
        foreach($result as $v){
            $arr[] = $v['bid'];
        }
        return $arr;
    }

    /**
     * 获取用户关注的社区信息
     * @param $uid
     * @return array|null
     */
    public static function getUserBbssInfo($uid){
        $bids = self::getUserBbssId($uid);
        if(!$bids){
            return null;
        }
        $result = [];
        foreach ($bids as $v) {
            $result[] = BbsModel::getBbsById($v, false);
        }
        return $result;
    }

    /**
     * 用户关注BBS
     * @param $uid
     * @param $bid
     * @return bool
     */
    public static function focus($uid, $bid){
        $model = M();
        $model->startTrans();
        // 先减少用户的贡献度
        if(!UserModel::updateGx($uid, 1, false)){
            $model->rollback();
            return false;
        }
        // 然后添加用户团体关系
        if(!self::addData($uid, $bid)){
            $model->rollback();
            return false;
        }
        // 再更新团体的关注数和贡献度
        $data = [
            'gx' => ['exp', ' gx + 1'],
            'focus' => ['exp', ' focus + 1']
        ];
        if(!BbsModel::update($bid, $data)){
            $model->rollback();
            return false;
        }
        if (!LogModel::userFocusBbs($uid, $bid)) {
            $model->rollback();
            return false;
        }
        $model->commit();
        return true;
    }

    /**
     * 用户取消关注BBS
     * @param $uid
     * @param $bid
     * @return bool
     */
    public static function cancelFocus($uid, $bid){
        $where = [
            'uid' => $uid,
            'bid' => $bid,
            'status' => self::NORMAL
        ];
        $model = M();
        $model->startTrans();
        // 先删除用户关注社区记录
        if(!M('UserBbs')->where($where)->setField('status', self::DELETE)){
            $model->rollback();
            return false;
        }
        // 再更新社区关注数
        if(!BbsCountModel::update($bid, 'focus', false)){
            $model->rollback();
            return false;
        }
        $model->commit();
        // 清空用户社区缓存
        self::clearCache($uid);
        return true;
    }

    /**
     * 检测用户是否已经关注该社区
     * @param $uid
     * @param $bid
     * @return bool
     */
    public static function checkFocused($uid, $bid){
        $focusArr = self::getUserBbssId($uid);
        return $focusArr ? in_array($bid, $focusArr) : false;
    }

    /**
     * 用户捐赠社区
     * @param $uid
     * @param $bid
     * @param $gx
     * @return bool
     */
    public static function donation($uid, $bid, $gx)
    {
        $model = M();
        $model->startTrans();
        // 先减少用户的贡献度
        if(!UserModel::updateGx($uid, $gx, false)){
            $model->rollback();
            return false;
        }
        // 再更新社区的贡献度
        if(!BbsModel::updateGx($bid, $gx)){
            $model->rollback();
            return false;
        }
        if (!LogModel::userDonateBbs($uid, $gx, $bid)) {
            $model->rollback();
            return false;
        }
        $model->commit();
        return true;
    }

    /**
     * 获取团体的所有关注数
     * @param $bid
     * @return mixed
     */
    public static function getFocusedCount($bid){
        return M('UserBbs')->where(['bid' => $bid])->count();
    }

    public static function clearCache($uid){
        $key = self::USER_BBS_KEY.$uid;
        S($key, null);
    }

}